今から始める Amazon Cognito 入門 #1:ユーザープールと ID プールの違い

今から始める Amazon Cognito 入門 #1:ユーザープールと ID プールの違い

Clock Icon2024.12.01

この記事は アノテーション株式会社 AWS Technical Support Advent Calendar 2024 | Advent Calendar 2024 - Qiita 1日目の記事です。

こんにちは! アノテーションの吉本です。

AWS のコンソール画面にアップデートがあり、見た目が大きく変わりました。
それに従い Cognito の操作方法も変わったので手を動かしながら Cognito に再入門していきたいと思います。

初めに

主にこの記事の中では Cognito の提供する機能について記載を行っていきます。
一般的な用語については簡単に以下のような形式で適宜説明を行いますが、詳細については別記事や外部サイト等も合わせてご確認ください。

本記事のゴール

ユーザープールと ID プールの違いを理解する

Cognito とは

初めに、Cognito の概要について確認を行っていきます。

https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/what-is-amazon-cognito.html

Amazon Cognito はウェブアプリとモバイルアプリ用のアイデンティティプラットフォームです。これは、ユーザーディレクトリ、認証サーバー、および OAuth 2.0 アクセストークンと AWS 認証情報の認証サービスです。Amazon Cognito を使用すると、組み込みのユーザーディレクトリ、エンタープライズディレクトリ、Google や Facebook などのコンシューマー ID プロバイダーからユーザーを認証および認可できます。

Cognito とは上記ドキュメントに記載のように、ウェブアプリやモバイルアプリに今や必須となった認証・認可の機能を実装する際に利用できるサービスとなっています。
Cognito には大きく分けて二種類のサービスが存在します。

Cognito ユーザープール

https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-user-pools.html

Amazon Cognito ユーザープールは、ウェブおよびモバイルアプリケーションの認証と認可のためのユーザーディレクトリです。

Cognito ユーザープールとは上記ドキュメントにも記載があるように認証認可両方を行うことができるサービスです。
単体で認証サーバーとしての機能を持ち、API やエンドポイントを通じて認証を実施することが可能です。
また、外部 Idp と連携を行い、認証機能を外出しし AWS サービスと外部 Idp の仲介を行うといった使い方も可能です。

API Gateway や別サービスと組み合わせることで権限の確認を行う認可を行うことも可能になりますが、基本的に認証を行うサービスと認識いただければと思います。

Cognito ID プール

https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-identity.html

Amazon Cognito アイデンティティプールは、 AWS 認証情報と交換できるフェデレーションアイデンティティのディレクトリです。ID プールは、サインインしているか、まだ識別していないかにかかわらず、アプリケーションのユーザーに一時的な AWS 認証情報を生成します。

Cognito ID プール(Cognito アイデンティティプールとも言います)とは主に認可を行うサービスとなります。
ユーザーが認証時に取得できる情報をもとに、一時的な AWS 認証情報を生成し提供します。
生成される AWS 認証情報は IAM ロールとなるため、アクセス可能なサービスなどを絞った権限を設定するなど任意の権限をユーザーの属性ごとに与えることが可能になります。

ユーザーの認証情報は Cognito ユーザープールから取得したものも利用可能ですが、その他 Google や Apple などサードパーティ製の認証サーバーから取得したものも利用いただけます。

では、実際にユーザープールで認証を行い、ID プールで認可を実施、最終的に AWS の一時認証情報を取得してみます。

やってみる(準備編)

まず、認証認可処理の確認に必要なものの準備を行なっていきます。
すでにユーザープールと ID プールを作成済みかつ、認証情報の取得が可能なユーザーが存在する場合読み飛ばしてください。

ユーザープールの作成

(1) ユーザープールを作成ボタンを押下

スクリーンショット 2024-11-28 14.14.05

(2) 設定値を入力

アプリケーションタイプを「シングルページアプリケーション(SPA)」、サインイン識別子のオプションにてメールアドレスにチェックを入れ、他はデフォルトで作成します。

スクリーンショット 2024-11-28 15.02.12

スクリーンショット 2024-11-28 14.14.58

(3) 「概要に移動」をクリック

次のページにいろいろ表示されますが、一旦ページを一番下までスクロールして「概要に移動」をクリックしてしまいましょう。

スクリーンショット 2024-11-28 14.19.04

お疲れ様でした!これでユーザープールが完成しました。

ユーザー登録(サインアップ)

早速ユーザーを一人登録してみましょう。今回は、AWS CLI を用いて登録を行います。
利用する API はこちら、CLI のドキュメントはこちらです。

(1) ユーザー作成に必要な情報の収集

SignUp API の実行には クライアント ID が必要です。
上記手順でユーザープールを作成した場合自動でアプリケーションクライアントが作成されているはずなので、そこから情報を取りにいきます。

左ペインから「アプリケーションクライアント」を選択し、「クライアント ID」を記録しておきます。

スクリーンショット 2024-11-28 14.48.08

また、ユーザーのステータスを変更するためにユーザープール ID も必要になるのでこのタイミングで取得しておきます。

左ペインから「概要」を選択し、「ユーザープール ID」を記録しておきます。

スクリーンショット 2024-11-28 17.01.08

(2) AWS CLI から sign-up コマンドを実行

ユーザー作成を行うため AWS CLI から sign-up コマンドを実行を実行します。

$ aws cognito-idp sign-up \
--client-id {クライアント ID} \
--username {メールアドレス} \
--password {パスワード} \
--user-attributes Name=email,Value={メールアドレス}

コマンドを実行し、コンソール画面からもユーザーの情報が確認できれば成功です。

スクリーンショット 2024-11-28 16.46.20

(3) ユーザーステータスを確認済みに変更

ユーザーのステータスが未確認の場合認証情報を取得することができません。
以下コマンドを AWS CLI で実行しステータスの変更を行います。

$ aws cognito-idp admin-confirm-sign-up \
--user-pool-id {ユーザープール ID} \
--username {メールアドレス}

これでユーザー作成は完了です。

ID プールの作成

続いて ID プールを作成していきます。

(1) ユーザープールを作成ボタンを押下

スクリーンショット 2024-11-28 17.06.02

(2) 設定値を入力

続いて設定値を入力していきます。
特に記載のない部分はデフォルトのままです。

ユーザーアクセスで「認証されたアクセス」にチェックを、認証された ID ソースで「Amazon Cognito ユーザープール」にチェックを入れます。

スクリーンショット 2024-11-28 17.11.06

IAM ロール名に任意の名前を登録します。
今回私は「userpool-authorized-role」としました。

スクリーンショット 2024-11-28 17.12.39

続いて、「ユーザープール ID」・「アプリクライアント ID」にて先ほど取得したユーザープールの情報を入力します。

スクリーンショット 2024-11-28 17.14.35

最後に ID プール名を設定します。

スクリーンショット 2024-11-28 17.18.43

以上で ID プールの作成が完了しました。

お疲れ様でした。ここまでで準備が完了しました。

やってみる(認証認可編)

実際に認証と認可を行ってみましょう。
今回行う処理のイメージは以下の通りです。

seq

ユーザープールでの認証処理

今回は、AWS CLI を用いて認証処理を行います。
利用する API はこちら、CLI のドキュメントはこちらです。

(1) AWS CLI から admin-initiate-auth コマンドを実行

$ aws cognito-idp admin-initiate-auth \
  --user-pool-id {ユーザープール ID} \
  --client-id {クライアント ID} \
  --auth-flow "ADMIN_USER_PASSWORD_AUTH" \
  --auth-parameters USERNAME={メールアドレス},PASSWORD={パスワード}

上記コマンドを実行します。
レスポンスとして以下のようなものが取得できれば成功です。

  {
    "ChallengeParameters": {},
    "AuthenticationResult": {
        "AccessToken": {アクセストークン},
        "ExpiresIn": 3600,
        "TokenType": "Bearer",
        "RefreshToken": {リフレッシュトークン},
        "IdToken": {ID トークン}
    }
}

ここで取得した ID トークンを用いて ID プールから認証情報を取得していきます。

ID プールでの認可処理

AWS 一時認証情報を取得するためには、まず Amazon Cognito ID を取得する必要があります。
取得した Amazon Cognito ID をさらに交換することで最終目的の AWS 一時認証情報が取得できます。

https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/getting-credentials.html

Amazon Cognito ID は認証情報ではありません。これらは、 AWS Security Token Service () のウェブ ID フェデレーションサポートを使用して認証情報と交換されますAWS STS。

それでは早速取得していきます。

(1) コマンド実行のために必要な情報の収集

まず、コマンド実行に必要な ID プールの ID を収集します。
ID プールの概要画面から取得可能です。

スクリーンショット 2024-11-28 17.51.19

(2) Amazon Cognito ID の取得

今回も AWS CLI を用いて実施します。
Amazon Cognito ID の取得にはこちらの API を利用します。AWS CLI のドキュメントはこちらです。

実際に利用するコマンドは以下です。

$ aws cognito-identity get-id \
  --identity-pool-id {ID プール ID} \
  --logins "cognito-idp.{リージョン}.amazonaws.com/{ユーザープール ID}={ID トークン}"

以下のように結果が返却されれば成功です。

{
    "IdentityId": XXXXX
}

(3) AWS 一時認証情報の取得

取得した Amazon Cognito ID を用いて AWS 一時認証情報を取得します。

利用する API はこちらの API を利用します。AWS CLI のドキュメントはこちらです。

実際に利用するコマンドは以下です。

$ aws cognito-identity get-credentials-for-identity \
  --identity-id {Amazon Cognito ID} \
  --logins "cognito-idp.{リージョン}.amazonaws.com/{ユーザープール ID}={ID トークン}"

以下のように結果が取得できれば成功です。

{
    "IdentityId": XXXXX,
    "Credentials": {
        "AccessKeyId": XXXXX,
        "SecretKey": XXXXX,
        "SessionToken": XXXXX,
        "Expiration": "XXXX-XX-XXTXX:XX:XX+XX:XX"
    }
}

お疲れ様でした!これで最終目標の AWS 一時認証情報の取得に成功しました。
取得した AWS 一時認証情報をセットし、ロールを確認します。

$ aws sts get-caller-identity 
{
    "UserId": "XXXXXXXXXXXXXXXXXXXXX:CognitoIdentityCredentials",
    "Account": "XXXXXXXXXXXX",
    "Arn": "arn:aws:sts::XXXXXXXXXXXX:assumed-role/userpool-authorized-role/CognitoIdentityCredentials"
}

ID プール作成時に設定したロールとなっていることが確認できました。

以上、実際に Cognito ユーザープールと Congito ID プールを用いた認証認可の流れを確認しました。
また次回があれば、次は Cognito ユーザープールで取得できるトークンの使い道について確認したいと思います。

参考資料

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.